home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.asm;
-
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.util.Enumeration;
- import java.util.Vector;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
-
- public final class Assembler implements Constants {
- static final int NOTREACHED = 0;
- static final int REACHED = 1;
- static final int NEEDED = 2;
- Label first = new Label();
- Instruction last;
- int maxdepth;
- int maxvar;
- int maxpc;
-
- public void add(Instruction var1) {
- if (var1 != null) {
- this.last.next = var1;
- this.last = var1;
- }
-
- }
-
- public void add(int var1, int var2) {
- this.add(new Instruction(var1, var2, (Object)null));
- }
-
- public void add(int var1, int var2, Object var3) {
- this.add(new Instruction(var1, var2, var3));
- }
-
- void optimize(Environment var1, Label var2) {
- var2.pc = 1;
-
- for(Instruction var3 = var2.next; var3 != null; var3 = var3.next) {
- switch (var3.pc) {
- case 0:
- var3.optimize(var1);
- var3.pc = 1;
- break;
- case 1:
- return;
- case 2:
- }
-
- switch (var3.opc) {
- case -3:
- TryData var7 = (TryData)var3.value;
- var7.getEndLabel().pc = 2;
- Enumeration var8 = var7.catches.elements();
-
- while(var8.hasMoreElements()) {
- CatchData var6 = (CatchData)var8.nextElement();
- this.optimize(var1, var6.getLabel());
- }
- break;
- case -2:
- case -1:
- if (var3.pc == 1) {
- var3.pc = 0;
- }
- break;
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- case 198:
- case 199:
- this.optimize(var1, (Label)var3.value);
- break;
- case 167:
- this.optimize(var1, (Label)var3.value);
- return;
- case 168:
- this.optimize(var1, (Label)var3.value);
- break;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- return;
- case 170:
- case 171:
- SwitchData var4 = (SwitchData)var3.value;
- this.optimize(var1, var4.defaultLabel);
- Enumeration var5 = var4.tab.elements();
-
- while(var5.hasMoreElements()) {
- this.optimize(var1, (Label)var5.nextElement());
- }
-
- return;
- }
- }
-
- }
-
- boolean eliminate() {
- boolean var1 = false;
- Object var2 = this.first;
-
- for(Instruction var3 = this.first.next; var3 != null; var3 = var3.next) {
- if (var3.pc != 0) {
- ((Instruction)var2).next = var3;
- var2 = var3;
- var3.pc = 0;
- } else {
- var1 = true;
- }
- }
-
- this.first.pc = 0;
- ((Instruction)var2).next = null;
- return var1;
- }
-
- public void optimize(Environment var1) {
- do {
- this.optimize(var1, this.first);
- } while(this.eliminate() && var1.optimize());
-
- }
-
- public void collect(Environment var1, FieldDefinition var2, ConstantPool var3) {
- if (var2 != null && var1.debug() && var2.getArguments() != null) {
- Enumeration var4 = var2.getArguments().elements();
-
- while(var4.hasMoreElements()) {
- FieldDefinition var5 = (FieldDefinition)var4.nextElement();
- var3.put(var5.getName().toString());
- var3.put(var5.getType().getTypeSignature());
- }
- }
-
- for(Object var6 = this.first; var6 != null; var6 = ((Instruction)var6).next) {
- ((Instruction)var6).collect(var3);
- }
-
- }
-
- void balance(Label var1, int var2) {
- for(Object var3 = var1; var3 != null; var3 = ((Instruction)var3).next) {
- var2 += ((Instruction)var3).balance();
- if (var2 < 0) {
- throw new CompilerError("stack under flow: " + ((Instruction)var3).toString() + " = " + var2);
- }
-
- if (var2 > this.maxdepth) {
- this.maxdepth = var2;
- }
-
- switch (((Instruction)var3).opc) {
- case -3:
- TryData var11 = (TryData)((Instruction)var3).value;
- Enumeration var12 = var11.catches.elements();
-
- while(var12.hasMoreElements()) {
- CatchData var6 = (CatchData)var12.nextElement();
- this.balance(var6.getLabel(), var2 + 1);
- }
- break;
- case -1:
- var1 = (Label)var3;
- if (((Instruction)var3).pc == 1) {
- if (var1.depth != var2) {
- throw new CompilerError("stack depth error " + var2 + "/" + var1.depth);
- }
-
- return;
- }
-
- var1.pc = 1;
- var1.depth = var2;
- break;
- case 21:
- case 23:
- case 25:
- case 54:
- case 56:
- case 58:
- int var10 = (((Instruction)var3).value instanceof Number ? ((Number)((Instruction)var3).value).intValue() : ((LocalVariable)((Instruction)var3).value).slot) + 1;
- if (var10 > this.maxvar) {
- this.maxvar = var10;
- }
- break;
- case 22:
- case 24:
- case 55:
- case 57:
- int var9 = (((Instruction)var3).value instanceof Number ? ((Number)((Instruction)var3).value).intValue() : ((LocalVariable)((Instruction)var3).value).slot) + 2;
- if (var9 > this.maxvar) {
- this.maxvar = var9;
- }
- break;
- case 132:
- int var8 = ((int[])((Instruction)var3).value)[0] + 1;
- if (var8 > this.maxvar) {
- this.maxvar = var8 + 1;
- }
- break;
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- case 198:
- case 199:
- this.balance((Label)((Instruction)var3).value, var2);
- break;
- case 167:
- this.balance((Label)((Instruction)var3).value, var2);
- return;
- case 168:
- this.balance((Label)((Instruction)var3).value, var2 + 1);
- break;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- return;
- case 170:
- case 171:
- SwitchData var4 = (SwitchData)((Instruction)var3).value;
- this.balance(var4.defaultLabel, var2);
- Enumeration var5 = var4.tab.elements();
-
- while(var5.hasMoreElements()) {
- this.balance((Label)var5.nextElement(), var2);
- }
-
- return;
- }
- }
-
- }
-
- public void write(Environment var1, DataOutputStream var2, FieldDefinition var3, ConstantPool var4) throws IOException {
- if (var3 != null && var3.getArguments() != null) {
- int var5 = 0;
- Vector var6 = var3.getArguments();
-
- FieldDefinition var8;
- for(Enumeration var7 = var6.elements(); var7.hasMoreElements(); var5 += var8.getType().stackSize()) {
- var8 = (FieldDefinition)var7.nextElement();
- }
-
- this.maxvar = var5;
- }
-
- try {
- this.balance(this.first, 0);
- } catch (CompilerError var9) {
- System.out.println("ERROR: " + var9);
- this.listing(System.out);
- throw var9;
- }
-
- int var10 = 0;
- int var11 = 0;
-
- for(Object var12 = this.first; var12 != null; var12 = ((Instruction)var12).next) {
- ((Instruction)var12).pc = var10;
- var10 += ((Instruction)var12).size(var4);
- if (((Instruction)var12).opc == -3) {
- var11 += ((TryData)((Instruction)var12).value).catches.size();
- }
- }
-
- var2.writeShort(this.maxdepth);
- var2.writeShort(this.maxvar);
- var2.writeInt(this.maxpc = var10);
-
- for(Instruction var13 = this.first.next; var13 != null; var13 = var13.next) {
- var13.write(var2, var4);
- }
-
- var2.writeShort(var11);
- if (var11 > 0) {
- this.writeExceptions(var1, var2, var4, this.first, this.last);
- }
-
- }
-
- void writeExceptions(Environment var1, DataOutputStream var2, ConstantPool var3, Instruction var4, Instruction var5) throws IOException {
- for(Object var6 = var4; var6 != var5.next; var6 = ((Instruction)var6).next) {
- if (((Instruction)var6).opc == -3) {
- TryData var7 = (TryData)((Instruction)var6).value;
- this.writeExceptions(var1, var2, var3, ((Instruction)var6).next, var7.getEndLabel());
- Enumeration var8 = var7.catches.elements();
-
- while(var8.hasMoreElements()) {
- CatchData var9 = (CatchData)var8.nextElement();
- var2.writeShort(((Instruction)var6).pc);
- var2.writeShort(var7.getEndLabel().pc);
- var2.writeShort(var9.getLabel().pc);
- if (var9.getType() != null) {
- var2.writeShort(var3.index(var9.getType()));
- } else {
- var2.writeShort(0);
- }
- }
-
- var6 = var7.getEndLabel();
- }
- }
-
- }
-
- public void writeLineNumberTable(Environment var1, DataOutputStream var2, ConstantPool var3) throws IOException {
- int var4 = -1;
- int var5 = 0;
-
- for(Object var6 = this.first; var6 != null; var6 = ((Instruction)var6).next) {
- int var7 = ((Instruction)var6).where >> 18;
- if (var7 > 0 && var4 != var7) {
- var4 = var7;
- ++var5;
- }
- }
-
- var4 = -1;
- var2.writeShort(var5);
-
- for(Object var10 = this.first; var10 != null; var10 = ((Instruction)var10).next) {
- int var8 = ((Instruction)var10).where >> 18;
- if (var8 > 0 && var4 != var8) {
- var4 = var8;
- var2.writeShort(((Instruction)var10).pc);
- var2.writeShort(var8);
- }
- }
-
- }
-
- void flowFields(Environment var1, Label var2, FieldDefinition[] var3) {
- if (var2.locals != null) {
- FieldDefinition[] var10 = var2.locals;
-
- for(int var11 = 0; var11 < this.maxvar; ++var11) {
- if (var10[var11] != var3[var11]) {
- var10[var11] = null;
- }
- }
-
- } else {
- var2.locals = new FieldDefinition[this.maxvar];
- System.arraycopy(var3, 0, var2.locals, 0, this.maxvar);
- FieldDefinition[] var4 = new FieldDefinition[this.maxvar];
- System.arraycopy(var3, 0, var4, 0, this.maxvar);
- var3 = var4;
-
- for(Instruction var5 = var2.next; var5 != null; var5 = var5.next) {
- switch (var5.opc) {
- case -3:
- Vector var13 = ((TryData)var5.value).catches;
- Enumeration var14 = var13.elements();
-
- while(var14.hasMoreElements()) {
- CatchData var8 = (CatchData)var14.nextElement();
- this.flowFields(var1, var8.getLabel(), var3);
- }
- break;
- case -1:
- this.flowFields(var1, (Label)var5, var3);
- return;
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- if (var5.value instanceof LocalVariable) {
- LocalVariable var12 = (LocalVariable)var5.value;
- var3[var12.slot] = var12.field;
- }
- break;
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- case 168:
- case 198:
- case 199:
- this.flowFields(var1, (Label)var5.value, var3);
- break;
- case 167:
- this.flowFields(var1, (Label)var5.value, var3);
- return;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- return;
- case 170:
- case 171:
- SwitchData var6 = (SwitchData)var5.value;
- this.flowFields(var1, var6.defaultLabel, var3);
- Enumeration var7 = var6.tab.elements();
-
- while(var7.hasMoreElements()) {
- this.flowFields(var1, (Label)var7.nextElement(), var3);
- }
-
- return;
- }
- }
-
- }
- }
-
- public void writeLocalVariableTable(Environment var1, FieldDefinition var2, DataOutputStream var3, ConstantPool var4) throws IOException {
- FieldDefinition[] var5 = new FieldDefinition[this.maxvar];
- int var6 = 0;
- if (var2 != null && var2.getArguments() != null) {
- int var7 = 0;
- Vector var8 = var2.getArguments();
-
- FieldDefinition var10;
- for(Enumeration var9 = var8.elements(); var9.hasMoreElements(); var7 += var10.getType().stackSize()) {
- var10 = (FieldDefinition)var9.nextElement();
- var5[var7] = var10;
- }
- }
-
- this.flowFields(var1, this.first, var5);
- LocalVariableTable var17 = new LocalVariableTable();
-
- for(int var12 = 0; var12 < this.maxvar; ++var12) {
- var5[var12] = null;
- }
-
- if (var2 != null && var2.getArguments() != null) {
- int var18 = 0;
- Vector var20 = var2.getArguments();
-
- FieldDefinition var11;
- for(Enumeration var22 = var20.elements(); var22.hasMoreElements(); var18 += var11.getType().stackSize()) {
- var11 = (FieldDefinition)var22.nextElement();
- var5[var18] = var11;
- var17.define(var11, var18, 0, this.maxpc);
- }
- }
-
- int[] var19 = new int[this.maxvar];
-
- for(Object var21 = this.first; var21 != null; var21 = ((Instruction)var21).next) {
- switch (((Instruction)var21).opc) {
- case -1:
- var6 = 0;
-
- for(; var6 < this.maxvar; ++var6) {
- if (var5[var6] != null) {
- var17.define(var5[var6], var6, var19[var6], ((Instruction)var21).pc);
- }
- }
-
- int var24 = ((Instruction)var21).pc;
- FieldDefinition[] var26 = ((Label)var21).locals;
- if (var26 == null) {
- for(int var14 = 0; var14 < this.maxvar; ++var14) {
- var5[var14] = null;
- }
- } else {
- System.arraycopy(var26, 0, var5, 0, this.maxvar);
- }
-
- for(int var15 = 0; var15 < this.maxvar; ++var15) {
- var19[var15] = var24;
- }
- break;
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- if (((Instruction)var21).value instanceof LocalVariable) {
- LocalVariable var23 = (LocalVariable)((Instruction)var21).value;
- int var25 = ((Instruction)var21).next != null ? ((Instruction)var21).next.pc : ((Instruction)var21).pc;
- if (var5[var23.slot] != null) {
- var17.define(var5[var23.slot], var23.slot, var19[var23.slot], var25);
- }
-
- var19[var23.slot] = var25;
- var5[var23.slot] = var23.field;
- }
- }
- }
-
- for(int var16 = 0; var16 < this.maxvar; ++var16) {
- if (var5[var16] != null) {
- var17.define(var5[var16], var16, var19[var16], this.maxpc);
- }
- }
-
- var17.write(var1, var3, var4);
- }
-
- public boolean empty() {
- return this.first == this.last;
- }
-
- public void listing(PrintStream var1) {
- var1.println("-- listing --");
-
- for(Object var2 = this.first; var2 != null; var2 = ((Instruction)var2).next) {
- var1.println(((Instruction)var2).toString());
- }
-
- }
-
- public Assembler() {
- this.last = this.first;
- }
- }
-